%     FASTENER DOCTOR - программа для лечения и конвертации крепежа
%     Copyright (C) 2018  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function [COORD_ADDRESS_TABLE, NODES_ADDRESS_TABLE, MPC_ADDRESS_TABLE, MATERIALS_ADDRESS_TABLE, ELEMENTS_ADDRESS_TABLE, PSETS_ADDRESS_TABLE] = Create_Address_Tables(COORD, MPC, MATERIALS, ELEMENTS, PSETS)

% DB_NODES (карточка GRID) | .ID | .Ref_Location(3,1) | .Location(3,1) | .Reference_CID | .Analysis_CID |

% COORD (карточки CORD2R, CORD2C) | .card | .ID | .Reference_Coord_ID | .A | .B | .C |

% MPC (карточка RBAR) | .card | .ID | .Nastran_ID | .GA | .GB | .CNA | .CNB | .CMA | .CMB | .ALPHA |
% MPC (карточка RBE2) | .card | .ID | .Nastran_ID | .GN | .CM | .GM(:,1) | .ALPHA |
% MPC (карточка RBE3) | .card | .ID | .Nastran_ID | .REFGRID | .REFC | .INDEP_DATA{:,1} | .ALPHA |
%      .INDEP_DATA{i} | .WT | .C | .G(:,1) |

% MATERIALS (карточка MAT1) | .card | .ID | .Patran_name | .E | .G | .NU | .RHO | .A | .TREF | .GE | .ST | .SC | .SS | .MCSID |
% MATERIALS (карточка MAT2) | .card | .ID | .Patran_name | .G11 | .G12 | .G13 |
%                                                               | .G22 | .G23 |
%                                                                      | .G33 |
%                                                                      | .RHO | .A1 | .A2 | .A3 | .TREF | .GE | .ST | .SC | .SS | .MCSID | .GE11 | .GE12 | .GE13 | .GE22 | .GE23 | .GE33 |
% MATERIALS (карточка MAT8) | .card | .ID | .Patran_name | .E1 | .E2 | .NU12 | .G12 | .G1Z | .G2Z | .RHO | .A1 | .A2 | .TREF | .Xt | .Xc | .Yt | .Yc | .S | .GE | .F12 | .STRN |
% MATERIALS (карточка MAT9) | .card | .ID | .Patran_name | .G11 | .G12 | .G13 | .G14 | .G15 | .G16 |
%                                                               | .G22 | .G23 | .G24 | .G25 | .G26 |
%                                                                      | .G33 | .G34 | .G35 | .G36 |
%                                                                             | .G44 | .G45 | .G46 |
%                                                                                    | .G55 | .G56 |
%                                                                                           | .G66 |
%                                                                                           | .RHO | .A1 | .A2 | .A3 | .A4 | .A5 | .A6 | .TREF | .GE | .GE11 | .GE12 | .GE13 | .GE14 | .GE15 | .GE16 | .GE22 | .GE23 | .GE24 | .GE25 | .GE26 | .GE33 | .GE34 | .GE35 | .GE36 | .GE44 | .GE45 | .GE46 | .GE55 | .GE56 | .GE66 |
%                                                                                           Расшифровка номеров сдвиговых компонент: 4 - 12, 5 - 23, 6 - 31
%
%    nu12*E2 = nu21*E1
%    nu23*E3 = nu32*E2
%    nu13*E3 = nu31*E1

% ELEMENTS (карточки CTETRA, CPENTA, CHEXA) | .card | .ID | .Prop_ID | .N_nodes | .Nodes(N_nodes,1) |
% ELEMENTS (карточка CQUAD4) | .card | .ID | .Prop_ID | .G(4,1) | .THETA_MCID | .ZOFFS | .TFLAG | .T1 | .T2 | .T3 | .T4 | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CQUAD8) | .card | .ID | .Prop_ID | .G(8,1) | .T1 | .T2 | .T3 | .T4 | .THETA_MCID | .ZOFFS | .TFLAG | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CTRIA3) | .card | .ID | .Prop_ID | .G(3,1) | .THETA_MCID | .ZOFFS | .TFLAG | .T1 | .T2 | .T3 | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CTRIA6) | .card | .ID | .Prop_ID | .G(6,1) | .THETA_MCID | .ZOFFS | .T1 | .T2 | .T3 | .TFLAG | .Ori_type (CID | Angle) |
% ELEMENTS (карточка  CBUSH) | .card | .ID | .Prop_ID | .GA | .GB | .GO | .X1 | .X2 | .X3 | .CID | .S | .OCID | .S1 | .S2 | .S3 |
% ELEMENTS (карточка   CROD) | .card | .ID | .Prop_ID | .G1 | .G2 |
% ELEMENTS (карточка   CBAR) | .card | .ID | .Prop_ID | .GA | .GB | .G0 | .X1 | .X2 | .X3 | .OFFT | .PA | .PB | .W1A | .W2A | .W3A | .W1B | .W2B | .W3B |
% ELEMENTS (карточка  CBEAM) | .card | .ID | .Prop_ID | .GA | .GB | .G0 | .X1 | .X2 | .X3 | .OFFT | .BIT | .PA | .PB | .W1A | .W2A | .W3A | .W1B | .W2B | .W3B | .SA | .SB |

% PSETS (карточка  PSOLID) | .card | .ID | .Patran_name | .Mat_ID | .CORDM | .IN | .STRESS | .ISOP | .FCTN | .COROT |
% PSETS (карточка   PCOMP) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,4) |
%           .Laminate(i,4) | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PCOMPG) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,5) | .GEFLG |
%           .Laminate(i,5) | GPLYIDi | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PSHELL) | .card | .ID | .Patran_name | .MID1 | .T | .MID2 | .I_ratio | .MID3 | .TS_T | .NSM | .Z1 | .Z2 | .MID4 |
% PSETS (карточка   PBUSH) | .card | .ID | .Patran_name | .K(6,1) | .B(6,1) | .GE(6,1) | .RCV(.SA .ST .EA .ET) | .M |
% PSETS (карточка    PROD) | .card | .ID | .Patran_name | .MID | .A | .J | .C | .NSM |
% PSETS (карточка PBMSECT) | .card | .ID | .Patran_name | .MID | .FORM | .Section_data |
% PSETS (карточка PBRSECT) | .card | .ID | .Patran_name | .MID | .FORM | .NSM | .Section_data |
% PSETS (карточка    PBAR) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 | .K1 | .K2 | .I12 |
% PSETS (карточка   PBARL) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM |
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка   PBEAM) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 |
%                          | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%                          | .K1 | .K2 | .S1 | .S2 | .NSI_A | .NSI_B | .CW_A | .CW_B | .M1_A | .M2_A | .M1_B | .M2_B | .N1_A | .N2_A | .N1_B | .N2_B |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 }
% PSETS (карточка  PBEAML) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .DIM(:,1)| .NSM }
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка  PBCOMP) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .K1 | .K2 | .M1 | .M2 | .N1 | .N2 | .SYMOPT | .N_lumped_areas | .Lumped_area_data{N_lumped_areas,1} |
%             .Lumped_area_data{i} : { .Y | .Z | .C | .MID }

global ErrCode;

global DB_NODES;

fprintf (1, 'Создание адресных таблиц...             ');

COORD_ADDRESS_TABLE = [];
NODES_ADDRESS_TABLE = [];
MPC_ADDRESS_TABLE = [];
MATERIALS_ADDRESS_TABLE = [];
ELEMENTS_ADDRESS_TABLE = [];
PSETS_ADDRESS_TABLE = [];

% Адресная таблица для систем координат

if (~isempty(COORD))

    Max_Coord_Number = 0;

    for i=1:size(COORD,1)

        if (COORD{i}.ID > Max_Coord_Number)

            Max_Coord_Number = COORD{i}.ID;

        end

    end

    COORD_ADDRESS_TABLE = zeros(Max_Coord_Number,1,'uint64');

    for i=1:size(COORD,1)
        
        if (COORD_ADDRESS_TABLE(COORD{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера системы координат %i !\n', COORD{i}.ID);
            ErrCode = -1;
            return;
        end
        
        COORD_ADDRESS_TABLE(COORD{i}.ID) = i;

    end

end

% Адресная таблица для узлов

if (~isempty(DB_NODES))

    Max_Node_Number = 0;

    for i=1:size(DB_NODES,1)

        if (DB_NODES{i}.ID > Max_Node_Number)

            Max_Node_Number = DB_NODES{i}.ID;

        end

    end

    NODES_ADDRESS_TABLE = zeros(Max_Node_Number,1,'uint64');

    for i=1:size(DB_NODES,1)
        
        if (NODES_ADDRESS_TABLE(DB_NODES{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера узла %i !\n', DB_NODES{i}.ID);
            ErrCode = -1;
            return;
        end

        NODES_ADDRESS_TABLE(DB_NODES{i}.ID) = i;

    end

end

% Адресная таблица для MPC

if (~isempty(MPC))

    Max_MPC_Number = 0;

    for i=1:size(MPC,1)

        if (MPC{i}.ID > Max_MPC_Number)

            Max_MPC_Number = MPC{i}.ID;

        end

    end

    MPC_ADDRESS_TABLE = zeros(Max_MPC_Number,1,'uint64');

    for i=1:size(MPC,1)
        
        if (MPC_ADDRESS_TABLE(MPC{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера MPC %i !\n', MPC{i}.ID);
            ErrCode = -1;
            return;
        end

        MPC_ADDRESS_TABLE(MPC{i}.ID) = i;

    end

end

% Адресная таблица для материалов

if (~isempty(MATERIALS))

    Max_Material_Number = 0;

    for i=1:size(MATERIALS,1)

        if (MATERIALS{i}.ID > Max_Material_Number)

            Max_Material_Number = MATERIALS{i}.ID;

        end

    end

    MATERIALS_ADDRESS_TABLE = zeros(Max_Material_Number,1,'uint64');

    for i=1:size(MATERIALS,1)
        
        if (MATERIALS_ADDRESS_TABLE(MATERIALS{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера материала %i !\n', MATERIALS{i}.ID);
            ErrCode = -1;
            return;
        end

        MATERIALS_ADDRESS_TABLE(MATERIALS{i}.ID) = i;

    end

end

% Адресная таблица для элементов

if (~isempty(ELEMENTS))

    Max_Element_Number = 0;

    for i=1:size(ELEMENTS,1)

        if (ELEMENTS{i}.ID > Max_Element_Number)

            Max_Element_Number = ELEMENTS{i}.ID;

        end

    end

    ELEMENTS_ADDRESS_TABLE = zeros(Max_Element_Number,1,'uint64');

    for i=1:size(ELEMENTS,1)
        
        if (ELEMENTS_ADDRESS_TABLE(ELEMENTS{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера элемента %i !\n', ELEMENTS{i}.ID);
            ErrCode = -1;
            return;
        end

        ELEMENTS_ADDRESS_TABLE(ELEMENTS{i}.ID) = i;

    end

end

% Адресная таблица для property sets

if (~isempty(PSETS))

    Max_Pset_Number = 0;

    for i=1:size(PSETS,1)

        if (PSETS{i}.ID > Max_Pset_Number)

            Max_Pset_Number = PSETS{i}.ID;

        end

    end

    PSETS_ADDRESS_TABLE = zeros(Max_Pset_Number,1,'uint64');

    for i=1:size(PSETS,1)
        
        if (PSETS_ADDRESS_TABLE(PSETS{i}.ID) ~= 0)
            fprintf (1, '\nОбнаружен повтор номера property set %i !\n', PSETS{i}.ID);
            ErrCode = -1;
            return;
        end

        PSETS_ADDRESS_TABLE(PSETS{i}.ID) = i;

    end

end

fprintf (1, 'OK!\n');
